home *** CD-ROM | disk | FTP | other *** search
- TownsSHELL アクセサリ Ver. 2
- 1994,8.10.
- ■ 背景
- TownsOS V2.1 L20 の頃、NAGUさんのフリーウェア「壁紙ムービー」を使っ
- て見て感動し、これだっ!と思いました。
- 壁紙ムービーとは TownsMENU の壁紙上にムービーを再生するサイドワークです。
- 当然ながらサイドワークを終了すれば止まってしまい、TownsMENU での作業中に眺
- める事はできませんでした。
- そこで、TownsMENU にバックグラウンド・タスクを実行させる機能をつけよう、と
- いう気になりました。
-
- ■ 経緯
- ○ TownsMENU アクセサリ (for TownsOS V2.1 L20)
- ・イベントループ
- 「TownsMENU はイベント・ドリブンで書かれているのだから、普段はイベント待
- ちループを回っているはず(普段は暇だろう)。ここに割り込んで、暇なときに他
- の仕事もやってもらおう」というのが最初の思い付きです。
- イベントループを見つける作業は簡単で、386debug で tmenu.exp を数千ステッ
- プ単位で実行させて状態が安定する所まで行けば、そこがイベントループの中です。
- ループ自体は小さいので、少しプログラムを追えば適当なフック・ポイントを見つ
- けられます。(このとき、このループの中でメニューバーの時計の処理もやってい
- るらしい事もわかりました。)
-
- ・最初のアクセサリ
- 最初は 32K 色の背景面全体の色をインクリメントしていく単純なプログラムを
- tmenu.exp 中の空き領域に直接埋め込んで実験しました。
- 最終目的はバックグラウンドでムービーを再生させる事なのですが、ディスク・ア
- クセスはするは DLL は使うは malloc もするはで簡単にはできそうもありません。
- そこで、ディスク・アクセスせず、簡単で、それでいて環境ソフトらしい題材を考
- え、「おさかな」になりました。
-
- ・REX の付加
- おさかな位のサイズになると、tmenu.exp の中に埋め込むことはできません。
- そこで、tmenu.exp の後ろに他のプログラム・モジュールを建て増しするツールを
- 作りました。これらのモジュールは relocatable である必要があるので REX に
- しました。
- イベント・ループをフックした箇所から、TMENU.EXP の後ろに建て増しした
- background task マネージャ HOOK.REX が呼ばれます。
- HOOK.REX では background task のチェーンを手繰りながら各々のエントリーを
- call していきます。
- 各 疑似background task は呼ばれたら、少し処理をして return します。
- この時、あまり長い間CPUを占有するとシステムが止まってしまいます。
-
- TMENU.EXP ファイルの変化
-
- オリジナル TMHOOK の後 TMADDの後
- +-----------+ +-----------+ +----------+
- | | | | | |
- | Text | | Text | | Text |
- | | | | | |
- | Data | | Data | | Data |
- | | | | | |
- | | | | | |
- +-----------+ |・・・・・ | |・・・・・|
- : : | BSS ? | | BSS ? |
- : min alloc : |...........| |..........|
- : : | HOOK.REX | | HOOK.REX |
- esp→+・・・・・ + +-----------+ +・・・・・+
- : 8KB : | FISH.REX |
- esp→+・・・・・ + +----------+
- : 8KB :
- esp→ +----------+
-
- TMENU.EXP が大きくなりロ-ド時間が増えるので、拡張部分は NSDD にして常駐
- させる手も考えましたが、TMENUが動いているときしか使わない物を常駐させるのは
- メモリがもったいないので、結局こうなりました。
-
- ・疑似background task の構造
- このプログラムは REX 形式で作ります。
- また、HOOK.REX が管理するためのヘッダーが先頭にあります。
- DD 0 ; NEXT POINTER
- DD 0 ; PREV POINTER
- DB "ABCDEFGH" ; 識別タグ(8byte)
- DD ENTRY ; このtaskのエントリ・アドレス
- DD STACKSIZE ; required stack size
- DD 1 ; bit#0 が ON ならこの task は有効
-
- 呼ばれたときにやる仕事量が多いと、システムの動作が遅くなってしまいます
- ので、加減してやる必要があります。
-
- ・ウィンドウ制御
- 次に環境ソフトとして定番の「NEKO」を移植したのですが、背景面上でおさ
- かなと共存させるために、表示が重なり合いにより描画を制御するソフトが必要に
- なり、ウインドウ制御モジュールを作成しました。ウインドウの重なり具合の変化
- による再描画処理の制御を行います。
-
- ・カスタマイズ
- 各アクセサリは tmenu.exp に直接組み込まれるので、起動時にオプションを指
- 定したりして動作を変えることはできません。
- 最初はバイナリ・エディタでプログラム中の変数を直接書き換える事にしていまし
- たが、面倒なので、変数名と値を指定すれば自動的に書き換えてくれるツールを作
- りました。プログラムのシンボル・テーブルを参照することにより変数の位置を求
- めています。
-
- ・L-MOVIE アクセサリ
- この中で egbwork と TL_malloc を使うので、これらの tmenu.exp 中の位置を
- 捜し出すのが問題でした。
- egbwork は、tmenu.exp の中で EBG系の tbios を使っている箇所を 386debug で
- サーチして見つけ、そこから遡って探しました。
- TL_malloc の在り処は手元の GUI ライブラリに入っている TL_malloc と同じパ
- ターンを 386debug でサーチして見つけました。
- また、ディスクをアクセスし続けるので、せめてスクリーン・セーバが働いてい
- る時は停止するように、SCSV を観測してセーバがアクティブになったのを検出し、
- 連動するようにしました。
- これで当初の目的「壁紙ムービー」は達成できました。(^_^)v
-
- ・ざんすアクセサリ
- ざんすもライブラリが公開されているので、試しに作ってみました。
- VSYNC 割り込みの ON/OFF をコントロールして実現しています。
- ・EUP アクセサリ
- 拙作の「BGMプレーヤ(EXP アプリを使いながら EUPHONY を鳴らす常駐ソフ
- ト)」を tmenu.exp 起動時に自動的に呼ぶアクセサリです。TownsMENU 起動と
- 同時に BGM が鳴りだします。
-
-
- ○ TownsSHELL アクセサリ (for TownsOS V2.1 L30,31)
- TownsSHELL V2.1L30 には元々、並行実行機能があります。
- TownsMENU のメニューバー上の時計とか、プリント・スプーラなどがこれを利用し
- ていると思われます。
- これと同様にして他の仕事もさせられるはずです。
- が、この時点では EXG アプリをい作成する方法がわからなかったので、とりあえ
- ず TownsMENU アクセサリと同じような方法(GSTART.EXP にパッチをあてる)で実
- 現しました。
- TownsSHELL 上で動くアプリが必ず呼ぶ部分を hook し、GSTART.EXP の後ろに建
- て増しした HOOK.REX を呼ぶようにしました。
- HOOK.REX では background task のチェーンを手繰りながら各々のエントリーを
- call していきます。 疑似background task は呼ばれたら、少し処理をして return
- します。
- このように、構造は TownsMENU アクセサリから変わってません。
- 高解像度画面に対応しました。
-
- アクセサリとして長太郎さんの「サイドワークBGV」と背景面上で共存させる
- ためのアクセサリを加えました。これは、BGVが表示される領域を検出して、そ
- こに透明なウインドウを張り付ける物です。これによりBGVウインドウもウイン
- ドウ制御下に置くことができます。
-
-
- ○ TownsSHELL アクセサリ Version 2 (for TownsOS V2.1 L31)
- High C の LVLUP が行われ EXG アプリの作成が可能になったので、従来のアク
- セサリを EXG 化しました。
- ウインドウ制御、NEKO、おさかな、ムービー、BGV共存
- です。
- SHELL のイベントを扱えるようになったので、背景面のオーナー権の移動や画面
- モードの変更を知る事ができるようになり、正しく振る舞えるようになりました。
- アイドル・タスクとして SHELL に登録してますが、呼び出される頻度は以前より
- 少なくなりました。
-